use std::{convert::TryFrom, io::{Bytes, Read, Write}, net::{TcpListener, TcpStream}, str::FromStr, thread};

use std::io::Error;
use std::time;

///处理数据流,返回处理结果
fn handle_client(mut stream: TcpStream) -> Result<(), Error> {
    //定义一个512长度的初始为0的数组.
    let mut buf:[u8;512] = [0; 512];
    //循环读取数据流1000次,实际应用中,应该一致监听数据流的读取,直到该连接关闭.
    for _ in 0..1000 {
        //从数据流中读取数据到buf缓存中,读取的字节个数为bytes_read.
        let bytes_read = stream.read(&mut buf)?;
        //如果读取到的字节数为0.则跳出循环,直接返回ok.
        if bytes_read==0{
            return Ok(());
        }
        
        println!("收到的字符串:{:?}",&buf);
        //将读取到的消息回写给客户端信息.
        stream.write(&buf)?;
        //线程休眠1秒
        thread::sleep(time::Duration::from_secs(1));
    }
    //返回ok.
    return Ok(());
}

fn main()->std::io::Result<()> {
    println!("开始程序!");
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    println!("开始监听端口!");
    //创建一个线程池的Vec
    let mut thread_vec:Vec<thread::JoinHandle<&str>>=Vec::new();
    //当有用户连接进来时得到一个stream.
    for stream in listener.incoming(){
        //从stream的result里面获取tcp流,如果发生错误,程序终止,返回failed错误.
        let ts=stream.expect("failed");
        //开启一个线程,并获得一个joinHanlder
        let join_hander=thread::spawn(move ||{
            let result = handle_client(ts);
            match result {
                Ok(())=>println!("数据处理成功"),
                Err(err)=>eprintln!("错误原因:{:?}",err),
            }
            //处理客户端流,解封装或者打印错误信息.
            // handle_client(ts).unwrap_or_else(|err|{
            //     eprintln!("{:?}",err);
            // });
            "执行成功"
        });
        //将joinHandler放入到线程队列中
        thread_vec.push(join_hander);
    }
    //如果程序结束,等待线程池中的所有线程处理完毕.
    for handle in thread_vec{
        handle.join().unwrap();
    }
    //返回OK
    Ok(())
}